/**
 * @desc 模拟处理时间不同的异步请求
 * @param item
 * @returns {Promise<unknown>}
 */
const asyncUppercase = item =>
	new Promise(resolve =>
		setTimeout(
			() => resolve(item.toUpperCase()),
			Math.floor(Math.random() * 1000)
		)
	);

/**
 * @desc for of 中的 await 将会导致代码停止，等待异步操作完成，这意味着所有承诺将按顺序运行，阻塞后边操作。
 * @returns {Promise<void>}
 */
const uppercaseItems1 = async () => {
	const items = ['a', 'b', 'c'];
	let item;
	for (item of items) {
		const uppercaseItem = await asyncUppercase(item);
		console.log(uppercaseItem);
	}

	console.log('Items processed');
};

/**
 * @desc Promise.all() 在于并行执行所有异步操作。这意味着承诺将无序执行，不会阻塞后边操作。
 * @returns {Promise<unknown[]>}
 */
const uppercaseItems2 = () => {
	const items = ['a', 'b', 'c'];
	return Promise.all(
		items.map(async item => {
			const uppercaseItem = await asyncUppercase(item);
			console.log(uppercaseItem);
		})
	).then(() => {
		console.log('Items processed');
	});
};


// LOGS: 'A', 'C', 'B', 'Items processed'

uppercaseItems1();  // LOGS: 'A', 'B', 'C', 'Items processed'
uppercaseItems2();  // LOGS: 'A', 'C', 'B', 'Items processed'
